﻿// See https://aka.ms/new-console-template for more information
//Console.WriteLine("Hello, World!");

// 开放封闭原则：软件实体应当对扩展开放，对修改关闭
//使用代码，描述不同需求的用户去银行办理不同的业务

//1.考虑的问题
//1.1 在这段程序中，会出现多少个对象
//1.2 每个对象的属性和方法行为


// 对象1：用户=》 属性：记录不同类型的用户（存钱，取钱，转账……）
// 对象2：银行柜员=》 帮助用户处理不同的需求
// 对象3：银行的业务系统：处理存钱，取钱，转账等业务的操作系统

using System.Security.Cryptography.X509Certificates;

using Console开放封闭原则;



//BankClient bankClient = new BankClient();

//bankClient.BankType = "取钱";
//BankStaff bankStaff = new BankStaff();
//bankStaff.HandleProcess(bankClient);

//bankClient.BankType = "存钱";
//bankStaff.HandleProcess(bankClient);

//bankClient.BankType = "转账";
//bankStaff.HandleProcess(bankClient);

//bankClient.BankType = "存钱aa";
//bankStaff.HandleProcess(bankClient);



// 修改三
IBankClient bankClient1 = new DepositeClient();
BankStaff bankStaff = new BankStaff();
bankStaff.HandleProcess(bankClient1);


Console.ReadLine();

public class BankClient
{
    public string BankType { get; set; } = string.Empty;
}
     
public class BankStaff
{
    //private BankProcess01 BankProcess = new BankProcess01();

    private IBankProcess bankProcess;
    //public void HandleProcess(BankClient client)
    //{
    //    // 根据用户的类型，调用银行的业务系统，处理用户的请求
    //    //// 一坨shift
    //    //switch (client.BankType)
    //    //{
    //    //    case "存钱":
    //    //        BankProcess.deposite = new DepostieClass();
    //    //        BankProcess.DepositeFunc();
    //    //        break;
    //    //    case "取钱":
    //    //        BankProcess.drawMoney = new DrawMoneyClass();
    //    //        BankProcess.DrawMoneyFunc();
    //    //        break;
    //    //    case "转账":
    //    //        BankProcess.transfer = new TransferClass();
    //    //        BankProcess.TransferFunc();
    //    //        break;
    //    //    default:
    //    //        Console.WriteLine($"当前银行未开通:{client.BankType}业务");
    //    //        break;
    //    //}

    //    //// 一坨shift
    //    //switch (client.BankType)
    //    //{
    //    //    case "存钱":
    //    //        bankProcess = new DepostieClass02();
    //    //        bankProcess.BankProcess();
    //    //        break;
    //    //    case "取钱":
    //    //        bankProcess = new DrawMoneyClass02();
    //    //        bankProcess.BankProcess();
    //    //        break;
    //    //    case "转账":
    //    //        bankProcess = new TransferClass02();
    //    //        bankProcess.BankProcess();
    //    //        break;
    //    //    default:
    //    //        Console.WriteLine($"当前银行未开通:{client.BankType}业务");
    //    //        break;
    //    //}

    //}

    public void HandleProcess(IBankClient client)
    {
        // 用户端调用自己的GetBankProcess方法，返回自己的业务处理对象IBankProcess
        bankProcess = client.GetBankProcess(); 
        bankProcess.BankProcess(); 
    }
}

// 不符合单一职责原则
public class BankProcess
{
    // 存钱
    public void Deposite()
    {
        Console.WriteLine("存钱");
    }
    public void DrayMoney()
    {
        Console.WriteLine("取钱");
    }
    public void Transfer()
    {
        Console.WriteLine( "转账");
    }
}






